package com.kyin.satoken.interceptor;

import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import com.kyin.satoken.common.R;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.ssssssss.magicapi.core.context.RequestEntity;
import org.ssssssss.magicapi.core.interceptor.RequestInterceptor;
import org.ssssssss.magicapi.core.model.ApiInfo;
import org.ssssssss.magicapi.core.model.JsonBean;
import org.ssssssss.magicapi.core.servlet.MagicHttpServletRequest;
import org.ssssssss.magicapi.core.servlet.MagicHttpServletResponse;
import org.ssssssss.script.MagicScriptContext;

import java.util.Map;

/**
 * 拦截请求
 */
@Component
@Order(1) //拦截器顺序，可选
public class MagicApiInterceptor implements RequestInterceptor {

   /*
   * 当返回对象时，直接将此对象返回到页面，返回null时，继续执行后续操作

   @Override
   public Object preHandle(ApiInfo info, MagicScriptContext context, MagicHttpServletRequest request, MagicHttpServletResponse response) {
       System.out.println("请求前：" + info.getPath());
       // 需要注意，ApiInfo 是页面上定义的信息，里面的值并不是实际请求的参数！！！
       // 拦截请求并直接返回结果，不继续后续代码
       // 需要注意的是，拦截器返回的结果不会被包裹一层json值，也不会走ResultProvider
//        return R.error( "非法访问");
       // 放开请求，执行后续代码
//       return null;
   }
    */
   /*
    此类有多个preHandle重载方法，根据需要自行选择
     */
   @Override
   public Object preHandle(RequestEntity requestEntity) throws Exception {
//       RequestEntity 是本次请求中所有的参数信息封装的对象，可以获取实际请求参数等信息
       Map<String, Object> headers = requestEntity.getHeaders();
       String magicToken = MapUtil.getStr(headers, "magic-token");
       String magicScriptId = MapUtil.getStr(headers, "magic-request-script-id");
       String magicClientId = MapUtil.getStr(headers, "magic-request-client-id");
       ApiInfo apiInfo = requestEntity.getApiInfo();
       String id = apiInfo.getId();
       if(StrUtil.isAllNotEmpty(magicToken, magicScriptId, magicClientId,id)){
           if(StrUtil.equals(id,magicScriptId)){
               return null;
           }
       }
       return R.error("非法访问");
   }

    /**
     * 执行完毕之后执行
     * @param value 即将要返回到页面的值
     * @return 返回到页面的对象,当返回null时执行后续拦截器，否则直接返回该值，不执行后续拦截器
     */
   @Override
   public Object postHandle(ApiInfo info, MagicScriptContext context, Object value, MagicHttpServletRequest request, MagicHttpServletResponse response) {
       // 需要注意，ApiInfo 是页面上定义的信息，里面的值并不是实际请求的参数！！！
       System.out.println("请求后：" + info.getPath());
       System.out.println("返回结果：" + value);
       // 拦截请求并直接返回结果，不继续后续代码
       // 需要注意的是，拦截器返回的结果不会被包裹一层json值，也不会走ResultProvider
//       return R.error( "非法访问");
       // 放开请求，执行后续代码
       return null;
   }

   /*
   此类有多个postHandle重载方法，根据需要自行选择
   @Override
   public Object postHandle(RequestEntity requestEntity, Object returnValue) throws Exception {
       RequestEntity 是本次请求中所有的参数信息封装的对象，可以获取实际请求参数等信息
       return null;
   }
   */
}